package com.soul.principle;

/**
 * 开放-封闭原则（OCP）
 * 一个软件实体应该通过扩展来实现变化，而不是通过修改已有的代码来实现变化的
 *
 * 如何使用开闭原则
 * 第一：抽象约束
 *  抽象是对一组事物的通用描述，没有具体的实现，也就表示它可以有非常多的可能性，可以跟随需求的变化而变化。
 *  因此，通过接口或抽象类可以约束一组可能变化的行为，并且能够实现对扩展开放，其包含三层含义：
 *      1.通过接口或抽象类约束扩展，对扩展进行边界限定，不允许出现在接口或抽象类中不存在的public方法。
 *      2.参数类型，引用对象尽量使用接口或抽象类，而不是实现类，这主要是实现里氏替换原则的一个要求
 *      3.抽象层尽量保持稳定，一旦确定就不要修改
 *
 * 第二：元数据(metadata)控件模块行为
 *  编程是一个很苦很累的活，那怎么才能减轻压力呢？答案是尽量使用元数据来控制程序的行为，减少重复开发。什么
 *  是元数据？用来描述环境和数据的数据，通俗的说就是配置参数，参数可以从文件中获得，也可以从数据库中获得。
 *
 * 第三：制定项目章程
 *  在一个团队中，建立项目章程是非常重要的，因为章程是所有人员都必须遵守的约定，对项目来说，约定优于配置。这
 *  比通过接口或抽象类进行约束效率更高，而扩展性一点也没有减少。
 *
 * 第四：封装变化
 *  对变化封装包含两层含义：
 *      1.将相同的变化封装到一个接口或抽象类中
 *      2.将不同的变化封装到不同的接口或抽象类中，不应该有两个不同的变化出现在同一个接口或抽象类中。
 *      封装变化，也就是受保护的变化，找出预计有变化或不稳定的点，我们为这些变化点创建稳定的接口。
 */
public class OpenClosedPrinciple {

    public String desc(){
        String str = "开放-封闭原则：软件实体应该可以扩展，但是不可修改，即对于扩展开放，对于修改封闭";
        return str;
    }
}
